package com.sz.controller.frame;

import com.sz.pojo.frame.User;
import org.springframework.ui.Model;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.Map;

/**
 * 控制器（Controller）需要实现
 * 
 * @author 哈尼玛
 * @框架文件 所有Controller 需要继承该超类
 * @param <T>
 *            对应的实体类（pojo包）
 */
public abstract class BaseController<T> {

    /** 成功 */
    public static final String SUCCESS = "success";
    /** 错误 */
    public static final String ERROR = "error";
    /** 登陆 */
    public static final String LOGIN = "login";
    /** 失败 */
    public static final String FAIL = "fail";

    public static final String PERFIX_PAGE = "./../../";

    /** 后台文件夹名 */
    public static final String PAGE_PREFIX = "admin/";
    /** 后台权限名 */
    public static final String PERMISSION_PREFIX = "/admin/";

    /** 到后台总页面 */
    public static final String INDEX_PAGE = PERFIX_PAGE + PAGE_PREFIX + "admin";
    /** 到后台欢迎页面 */
    public static final String WELCOME_PAGE = PERFIX_PAGE + PAGE_PREFIX + "welcome";
    /** 到后台成功页面 */
    public static final String SUCCESS_PAGE = PERFIX_PAGE + PAGE_PREFIX + "success";
    /** 到后台登陆页面 */
    public static final String LOGIN_PAGE = PERFIX_PAGE + PAGE_PREFIX + "login";
    /** 到后台提示页面 */
    public static final String MESSAGE_PAGE = PERFIX_PAGE + PAGE_PREFIX + "message";
    
    /** 前台文件夹名 */
    public static final String WEB_PAGE_PREFIX = "web/";
    /** 前台权限名 */
    public static final String WEB_PERMISSION_PREFIX = "/web/";
    
    /** 到前台总页面 */
    public static final String WEB_INDEX_PAGE = PERFIX_PAGE + WEB_PAGE_PREFIX + "admin";
    /** 到前台欢迎页面 */
    public static final String WEB_WELCOME_PAGE = PERFIX_PAGE + WEB_PAGE_PREFIX + "welcome";
    /** 到前台成功页面 */
    public static final String WEB_SUCCESS_PAGE = PERFIX_PAGE + WEB_PAGE_PREFIX + "success";
    /** 到前台登陆页面 */
    public static final String WEB_LOGIN_PAGE = PERFIX_PAGE + WEB_PAGE_PREFIX + "login";
    /** 到前台提示页面 */
    public static final String WEB_MESSAGE_PAGE = PERFIX_PAGE + WEB_PAGE_PREFIX + "message";
    /** 到前台404页面 */
    public static final String WEB_404 = PERFIX_PAGE + WEB_PAGE_PREFIX + "404";

    /** APP到错误页面 */
    public static final String APP_ERROR_PAGE = "./../../app/error";

    /** 后台前缀 */
    private String prefix;
    /** 后台权限前缀 */
    private String permissionPrefix;
    /** 前台前缀 */
    private String webPrefix;
    /** 前台权限前缀 */
    private String webPermissionPrefix;

    /**
     * 根据pojoName初始化controller
     * 
     * @param pojoName
     */
    public BaseController(String pojoName) {
        this.prefix = PAGE_PREFIX + pojoName + "/";
        this.permissionPrefix = PERMISSION_PREFIX + pojoName + "/";
        this.webPrefix = WEB_PAGE_PREFIX + pojoName + "/";
        this.webPermissionPrefix = WEB_PERMISSION_PREFIX + pojoName + "/";
    }

    /**
     * 得到当前时间
     * 
     * @return
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 判断用户是否登陆
     * 
     * @param session
     * @return
     */
    public boolean isLogin(HttpSession session) {
        User user = (User) session.getAttribute("sessionUser");
        if (user != null) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 根据@RequestMapping获取后台实际路径
     * 
     * @param url
     *            例如："list"
     * @return 处理成功的url【"admin/function/list"】
     */
    public String url(String url) {
        return this.prefix + url;
    }
    
    /**
     * 根据@RequestMapping获取前台实际路径
     * 
     * @param url
     *            例如："list"
     * @return 处理成功的url【"web/function/list"】
     */
    public String webUrl(String url) {
        return this.webPrefix + url;
    }

    /**
     * 根据@RequestMapping获取后台实际路径【重定向url】
     * 
     * @param url
     *            例如："list"
     * @param attributes
     *            例如："RedirectAttributes"
     * @param paramsSuffix
     *            例如："参数的map集合"
     * @return 处理成功的url【"redirect:/admin/function/list"】 +
     *         attributes.addFlashAttribute(key, paramsSuffix.get(key))
     */
    public String redirectUrl(String url, RedirectAttributes attributes, Map<String, Object> paramsSuffix) {
        if (attributes != null && paramsSuffix != null && paramsSuffix.size() > 0) {
            for (String key : paramsSuffix.keySet()) {
                attributes.addFlashAttribute(key, paramsSuffix.get(key));
            }
        }
        return "redirect:" + this.permissionPrefix + url;
    }
    
    /**
     * 根据@RequestMapping获取前台实际路径【重定向url】
     * 
     * @param url
     *            例如："list"
     * @param attributes
     *            例如："RedirectAttributes"
     * @param paramsSuffix
     *            例如："参数的map集合"
     * @return 处理成功的url【"redirect:/web/function/list"】 +
     *         attributes.addFlashAttribute(key, paramsSuffix.get(key))
     */
    public String redirectWebUrl(String url, RedirectAttributes attributes, Map<String, Object> paramsSuffix) {
        if (attributes != null && paramsSuffix != null && paramsSuffix.size() > 0) {
            for (String key : paramsSuffix.keySet()) {
                attributes.addFlashAttribute(key, paramsSuffix.get(key));
            }
        }
        return "redirect:" + this.webPermissionPrefix + url;
    }

    /**
     * 根据@RequestMapping获取后台实际路径【重定向url】
     * 
     * @param url  使用controller中的URL常量
     *            例如："/admin/function/list"
     * @return 处理成功的url【"redirect:传入的URL常量"】
     */
    public String redirectUrl(String url) {
        return "redirect:" + url;
    }

    /**
     * 后台跳转方法【用于新增和编辑跳转】
     * 
     * @param m
     * @param id
     * @return
     */
    public abstract String modify(Model m, Long id);

    /**
     * 后台删除方法
     * 
     * @param m
     * @param ids
     * @return
     */
    public abstract String remove(Model m, String ids);

    /**
     * 后台保存方法
     * 
     * @param m
     * @param t
     *            对象
     * @return
     */
    public abstract String save(Model m, T t);

}
